﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.Windows.Forms;
using ThaiHoa.Win.QLSX.Entity;
using ThaiHoa.Win.QLSX.Kho.UTI;
using ThaiHoa.Win.QLSX.DAL;
using Excel = Microsoft.Office.Interop.Excel;

namespace ThaiHoa.Win.QLSX.Kho.UI
{
    public partial class frmTonKhoToiThieu : Form
    {
        #region Fields
        KhoDBContext db;
        BindingSource tonKhoToiThieuBS;
        List<PhienBanTonKhoToiThieu> listPhienBan;
        List<LoaiVatTu> listLoaiVatTu;
        List<int> listNam;
        #endregion
        #region Contructor
        public frmTonKhoToiThieu()
        {
            InitializeComponent();
        }
        #endregion
        #region Functions
        /// <summary>
        /// load dữ liệu khi khởi động form
        /// </summary>
        private void LoadData()
        {
            db = new KhoDBContext();
            tonKhoToiThieuBS = new BindingSource();
            listLoaiVatTu = new List<LoaiVatTu>();
            listLoaiVatTu.Add(new LoaiVatTu() { TenLoai = "Tất Cả" });
            listLoaiVatTu.AddRange(db.LoaiVatTu.Where(l=>l.TrangThai).ToList());

            //db.TonKhoToiThieu
            //        .Where(t=>t.TrangThai)
            //        .Include("PhienBanTonKhoToiThieu")
            //        .Include("VatTu")
            //        .Load();                    
            
            listNam =db.PhienBanTonKhoToiThieu.Where(l => l.TrangThai).Select(l => l.Nam).Distinct().ToList();

            cbLoaiVatTu.DataSource = listLoaiVatTu;            
            cbNam.DataSource = listNam.Distinct().ToList();
            if (listPhienBan == null) listPhienBan = new List<PhienBanTonKhoToiThieu>();
            HienThiDuLieu(listPhienBan.FirstOrDefault());
        }
        private void HienThiDuLieu(PhienBanTonKhoToiThieu phienBan)
        {
            db = new KhoDBContext();
            if (phienBan == null) return;
            cbNam.SelectedItem = phienBan.Nam;
            cbPhienBan.SelectedItem = phienBan;
            //cbNam.SelectedItem = phienBan.Nam;
            //cbLoaiVatTu.SelectedItem = listLoaiVatTu.FirstOrDefault();
            chkHieuLuc.Checked = phienBan.HieuLuc;
            LoaiVatTu loaiVatTu = cbLoaiVatTu.SelectedItem as LoaiVatTu;
            tonKhoToiThieuBS.DataSource = db.TonKhoToiThieu.Local.ToBindingList();
            tonKhoToiThieuBS.RemoveFilter();
            if (loaiVatTu.TenLoai == "Tất Cả")
            {
                db.TonKhoToiThieu
                    .Where(t => t.TrangThai
                        && t.PhienBanTonKhoToiThieu.TenPhienBan == phienBan.TenPhienBan
                        && t.PhienBanTonKhoToiThieu.Nam == phienBan.Nam
                        )
                    .Include("PhienBanTonKhoToiThieu")
                    .Include("VatTu")
                    .Load();
            }
            else
            {
                db.TonKhoToiThieu
                    .Where(
                        t => t.TrangThai
                        && t.VatTu.LoaiVatTu.Id.Equals(loaiVatTu.Id)
                        && t.PhienBanTonKhoToiThieu.TenPhienBan == phienBan.TenPhienBan
                        && t.PhienBanTonKhoToiThieu.Nam == phienBan.Nam
                        )
                    .Include("PhienBanTonKhoToiThieu")
                    .Include("VatTu")
                    .Load();
            }
            tonKhoToiThieuBS.DataSource = db.TonKhoToiThieu.Local.ToBindingList();
            dgvTonKhoToiThieu.AllowUserToAddRows = false;
            dgvTonKhoToiThieu.AllowUserToDeleteRows = false;
            dgvTonKhoToiThieu.DataSource = tonKhoToiThieuBS;
            CustomerGridView();
        }
        /// <summary>
        /// Kiểm tra tên phiên bản xem đã được dùng chưa (trong năm)
        /// True : đã được dùng
        /// False : Chưa được dùng
        /// </summary>
        /// <param name="tenPhienBan"></param>
        /// <returns></returns>
        private bool KiemTraTenPhienBan(string tenPhienBan)
        { 
            int yearNow=DateTime.Now.Year;
            return db.PhienBanTonKhoToiThieu.Any(p => p.TrangThai && p.Nam.Equals(yearNow) && p.TenPhienBan.Equals(tenPhienBan));

        }
        private void TaoPhienBanMoi()
        {
            
            //
            string tenPhienBan = Microsoft.VisualBasic.Interaction.InputBox("Nhập Tên Cho Phiên Bản", "");
            if (tenPhienBan == null || tenPhienBan == "")
            {
                MessageBox.Show("Tên phiên bản không được rỗng");
                return;
            }
            if (KiemTraTenPhienBan(tenPhienBan))
            {
                MessageBox.Show("Tên phiên bản đã được dùng");
                return;
            }
            PhienBanTonKhoToiThieu newPhienBan = new PhienBanTonKhoToiThieu();
            newPhienBan.TenPhienBan = tenPhienBan;
            newPhienBan.HieuLuc = true;//set hiệu lực
            newPhienBan.Nam = DateTime.Now.Year;

            //Hủy hiệu lực ở các phiên bản trước đó
            List<PhienBanTonKhoToiThieu> listPhienBan = db.PhienBanTonKhoToiThieu.ToList();
            foreach (PhienBanTonKhoToiThieu item in listPhienBan)
            {
                if (item.HieuLuc)
                    item.HieuLuc = false;
            }
            
            db.PhienBanTonKhoToiThieu.Add(newPhienBan);
            //Thêm danh sách vật tư vào phiên bản
            List<VatTu> listVatTu = db.VatTu.ToList();
            TonKhoToiThieu tonKhoToiThieu;
            foreach (VatTu item in listVatTu)
            {
                tonKhoToiThieu = new TonKhoToiThieu();
                tonKhoToiThieu.VatTu = item;
                tonKhoToiThieu.TonToiThieu = 0;
                tonKhoToiThieu.PhienBanTonKhoToiThieu = newPhienBan;
                db.TonKhoToiThieu.Add(tonKhoToiThieu); 
            }
            db.SaveChanges();   
            //Hiển thị dữ liệu
            if(!listNam.Any(l=>l.Equals(DateTime.Now.Year)))
                 listNam =db.PhienBanTonKhoToiThieu.Where(l => l.TrangThai).Select(l => l.Nam).Distinct().ToList();
            listPhienBan = db.PhienBanTonKhoToiThieu.Where(p => p.TrangThai && p.Nam.Equals(newPhienBan.Nam)).ToList();
            cbPhienBan.DataSource = listPhienBan;
            HienThiDuLieu(newPhienBan);
            
        }
        public void HienThiDuLieuTheocbNam()
        {
            int nam = (int)cbNam.SelectedItem;
            listPhienBan = db.PhienBanTonKhoToiThieu.Where(p => p.TrangThai && p.Nam.Equals(nam)).ToList();
            cbPhienBan.DataSource = listPhienBan;
            PhienBanTonKhoToiThieu item = cbPhienBan.SelectedItem as PhienBanTonKhoToiThieu;

            HienThiDuLieu(item);
        }
        private void CustomerGridView()
        {
            //Ẩn toàn bộ columns
            foreach (DataGridViewColumn item in dgvTonKhoToiThieu.Columns)
            {
                item.Visible = false;
            }
            //Tùy chỉnh lại
            //Mã
            var c = dgvTonKhoToiThieu.Columns["VatTu"];
            c.Visible = true;
            c.Width = 200;
            c.DisplayIndex = 1;
            c.ReadOnly = true;

            //Tồn tối thiểu
            c = dgvTonKhoToiThieu.Columns["TonToiThieu"];
            c.Visible = true;
            c.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            c.DisplayIndex = 2;
        }
        /// <summary>
        /// Xóa phiên bản tồn kho tối thiểu
        /// </summary>
        /// <param name="phienBan"></param>
        private void XoaPhienBan(PhienBanTonKhoToiThieu phienBan)
        {
            if (MessageBox.Show("Xóa phiên bản này ?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                //Kiểm tra hợp lệ
                if (phienBan == null) return;
                //Xóa danh sách tồn kho tối thiểu liên quan
                List<TonKhoToiThieu> listTonKhoToiThieu = db.TonKhoToiThieu.Include("PhienBanTonKhoToiThieu").Include("VatTu").Where(t => t.TrangThai && t.PhienBanTonKhoToiThieu.Id.Equals(phienBan.Id)).ToList();
                foreach (var item in listTonKhoToiThieu)
                {
                    db.TonKhoToiThieu.Remove(item);
                }
                db.SaveChanges();
                //Xóa phiên bản
                phienBan = db.PhienBanTonKhoToiThieu.FirstOrDefault(p => p.Id.Equals(phienBan.Id));
                if (phienBan == null) return;
                if (phienBan.HieuLuc)//Nếu phiên bản hiện tại đang có hiệu lực thì phải set hiệu lực cho phiên bản khác
                { 
                    //Xét hiệu lực ở phiên bản có ngày tạo gần ngày hiện tại nhất
                    var phienBanHieuLuc = db.PhienBanTonKhoToiThieu.OrderBy(p => p.NgayTao).FirstOrDefault();
                    if (phienBanHieuLuc != null)
                    {
                        phienBanHieuLuc.HieuLuc = true;
                    }
                }
                phienBan.TrangThai = false;

                //Lưu lại
                db.SaveChanges();

                //Hiển thị lại dữ liệu
                HienThiDuLieuTheocbNam();
            }
        }
        /// <summary>
        /// Lưu lại những thay đổi trên gridview
        /// </summary>
        private void Save()
        {
            //Lấy ra phiên bản hiện tại
            PhienBanTonKhoToiThieu phienBan = cbPhienBan.SelectedItem as PhienBanTonKhoToiThieu;
            if (phienBan == null) return;
            phienBan.HieuLuc = chkHieuLuc.Checked;
            //if (MessageBox.Show("Lưu thay đổi ?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            //{
                if (chkHieuLuc.Checked)//Nếu phiên bản hiện tại ở trạng thái có hiệu lực
                {
                    //Hủy hiệu lực ở các phiên bản trước đó
                    List<PhienBanTonKhoToiThieu> listPhienBan = db.PhienBanTonKhoToiThieu.ToList();
                    foreach (PhienBanTonKhoToiThieu item in listPhienBan)
                    {
                        if (item.HieuLuc && 
                            !item.Id.Equals(phienBan.Id)) //Trừ phiên bản hiện tại
                            item.HieuLuc = false;
                    }
                }
                db.SaveChanges();
            //}
        }
        private void ExportToExcel()
        {
            string workbookPath = Application.StartupPath + @"\Template\Excel\JAT_VatTu_TonKhoToiThieu";
            Excel.Application xlApp = new Excel.Application();
            Excel.Workbook xlWorkBook = xlApp.Workbooks.Open(workbookPath,
                0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
                true, false, 0, true, false, false);
            Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets[1];
            xlWorkBook.Activate();
            xlWorkSheet.Name = "TonKhoToiThieu";
            //Add data
            var listTonKhoToiThieu = tonKhoToiThieuBS.List;
            int count = 0;
            int positionStart = 11;
            Excel.Range r;
            foreach (TonKhoToiThieu item in listTonKhoToiThieu)
            {
                xlWorkSheet.Cells[positionStart + count, 1] = count + 1;
                xlWorkSheet.Cells[positionStart + count, 2] = item.VatTu.MaMatHang;
                xlWorkSheet.Cells[positionStart + count, 3] = item.VatTu.TenMatHang;
                xlWorkSheet.Cells[positionStart + count, 4] = item.TonToiThieu;

               

                //Định dạng cho các hàng dl              
                string start = "A" + (count + positionStart).ToString();
                string stop = "D" + (count + positionStart).ToString();
                r = (Excel.Range)xlWorkSheet.get_Range(start, stop);
                r.Borders.Color = Color.Black;
                r.RowHeight = 30;
                r.Style.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
                r.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, Excel.XlColorIndex.xlColorIndexAutomatic);
                count++;

            }
            //định dạng cho phần header
            PhienBanTonKhoToiThieu phienBan = cbPhienBan.SelectedItem as PhienBanTonKhoToiThieu;
            r = (Excel.Range)xlWorkSheet.get_Range("A4", "D4");
            //Tùy biến tên tiêu đề trên excel
            LoaiVatTu loaiVatTu = cbLoaiVatTu.SelectedItem as LoaiVatTu;
            if (loaiVatTu == null) return;
            switch (loaiVatTu.TenLoai)
            {
                case "Tất Cả":
                    r.Value2 = "BẢNG TỒN KHO TỐI THIỂU";
                    break;
                case "Thép Đặc":
                    r.Value2 = "BẢNG TỒN KHO TỐI THIỂU THÉP ĐẶC";
                    break;
                case "Thép Ống":
                    r.Value2 = "BẢNG TỒN KHO TỐI THIỂU THÉP ỐNG";
                    break;
                case "Thép Tấm":
                    r.Value2 = "BẢNG TỒN KHO TỐI THIỂU THÉP TẤM";
                    break;
                case "Thép Lưới":
                    r.Value2 = "BẢNG TỒN KHO TỐI THIỂU LƯỚI";
                    break;
                case "Tôn":
                    r.Value2 = "BẢNG TỒN KHO TỐI THIỂU TÔN";
                    break;
            }
               
            //Tùy biến tên phiên bản
            xlWorkSheet.Cells[6, 4] = phienBan.TenPhienBan;
            xlWorkSheet.Cells[7, 4] = "Ngày " + phienBan.NgayTao.ToString("dd/MM/yyy");
            // Ẩn chương trình
            xlApp.Visible = false;

            // Save file
            xlWorkBook.SaveAs("C:\\JAT_VatTu_TonKHoToiThieu.xls", Excel.XlFileFormat.xlWorkbookNormal,
                            null, null, false, false,
                            Excel.XlSaveAsAccessMode.xlExclusive,
                            false, false, false, false, false);
            xlApp.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);



            MessageBox.Show("File created !");
        }
        #endregion
        #region Events
        private void frmTonKhoToiThieu_Load(object sender, EventArgs e)
        {
            LoadData();
        }
        private void newToolStripButton_Click(object sender, EventArgs e)
        {
            TaoPhienBanMoi();
        }
        private void cbPhienBan_SelectedIndexChanged(object sender, EventArgs e)
        {
            PhienBanTonKhoToiThieu item = cbPhienBan.SelectedItem as PhienBanTonKhoToiThieu;
            HienThiDuLieu(item);
        }
        private void saveToolStripButton_Click(object sender, EventArgs e)
        {
            Save();
        }

        private void cbLoaiVatTu_SelectedIndexChanged(object sender, EventArgs e)
        {
            PhienBanTonKhoToiThieu item = cbPhienBan.SelectedItem as PhienBanTonKhoToiThieu;
            HienThiDuLieu(item);
        }

        private void cbNam_SelectedIndexChanged(object sender, EventArgs e)
        {
            HienThiDuLieuTheocbNam();
        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            PhienBanTonKhoToiThieu item = cbPhienBan.SelectedItem as PhienBanTonKhoToiThieu;
            XoaPhienBan(item);
        }

        private void exportToolStripButton_Click(object sender, EventArgs e)
        {
            ExportToExcel();
        }

        #endregion       
    }
}
